﻿#include "cylinderspeed.h"
#include "qthread.h"
#include <qdebug.h>

cylinderspeed::cylinderspeed(QObject* parent) :  QObject {parent}
{

    subThread = new QThread;
    this->moveToThread(subThread);

    subThread->start();
    timer.start();
}
cylinderspeed::~cylinderspeed()
{
    subThread->quit();
    subThread->wait();
    delete subThread;
}

void cylinderspeed::slotSpeedInfoHandle(int deviceID, const QByteArray& data)
{
    if(deviceID != 1)
    {
        return;
    }

    static double last_displacement = -1.0;  // 记录上一次的位移，初始值设为 -1 避免错误
    static qint64 last_time_ms = 0; // 记录上一次的时间
    //解析位移数据
    int displament_int0;
    double displament;
    displament_int0 = (data[3] << 8 ) | (data[4] & 0xFF);
    qDebug() << "转换成十进制后" << displament_int0;
    //这里要使用隐式转换实现，其中一个数成为double类型，或者直接使用其中一个数记性double类型的转换
    displament = static_cast<double>(displament_int0) / (4095 / 550);
    qDebug() << "实际的输出值" << displament;

    qint64 current_time_ms = timer.elapsed();

    if (last_displacement >= 0 && last_time_ms > 0)   // 确保已经有历史数据
    {
        qint64 delta_t_ms = current_time_ms - last_time_ms;

        if (delta_t_ms > 0)    // 避免除零错误
        {
            double delta_s = displament - last_displacement;
            double velocity = delta_s / (delta_t_ms / 1000.0); // 计算速度（单位 mm/s）

            qDebug() << "计算出的速度 (mm/s):" << velocity;

            // 发送速度信号
            emit sigSpeedvalue(velocity);
        }
    }
    // **在 emit 之后更新上一次数据**
    last_displacement = displament;
    last_time_ms = current_time_ms;
}
